package com.chaoxinet.csmall.passport.controller;

import com.chaoxinet.csmall.passport.pojo.dto.AdminAddNewDTO;
import com.chaoxinet.csmall.passport.pojo.dto.AdminLoginDTO;
import com.chaoxinet.csmall.passport.pojo.vo.AdminListItemVO;
import com.chaoxinet.csmall.passport.security.LoginPrincipal;
import com.chaoxinet.csmall.passport.service.AdminService;
import com.chaoxinet.csmall.passport.web.JsonResult;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;

/**
 * 管理员控制器
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Api(tags = "1. 管理员管理模块")
@RestController
@RequestMapping("/admins")
public class AdminController {

    @Autowired
    private AdminService service;

    /**
     * 登录接口
     *
     * @param adminLoginDTO 登录信息
     * @return 登录结果
     */
    @ApiOperation("管理员登录")
    @ApiOperationSupport(order = 100)
    @PostMapping("/login")
    public JsonResult<String> login(AdminLoginDTO adminLoginDTO) {
        // 调用服务层的登录方法
        log.debug("接收到的请求参数：{}", adminLoginDTO);
        log.debug("准备调用service中的login方法.");
        String jwt = service.login(adminLoginDTO);
        // 返回登录结果
        return JsonResult.ok(jwt);
    }


    /**
     * 添加管理员
     *
     * @param adminAddNewDTO 管理员添加信息
     * @return JsonResult<Void> 返回结果
     */
    @ApiOperation("添加管理员")
    @ApiOperationSupport(order = 200)
    @PostMapping("/add-new")
    public JsonResult<Void> addNew(AdminAddNewDTO adminAddNewDTO) {
        log.debug("接收到的请求参数：{}", adminAddNewDTO);
        // 调用服务层的addNew方法添加管理员
        service.addNew(adminAddNewDTO);
        return JsonResult.ok();
    }

    /**
     * 删除管理员
     *
     * @param id 管理员ID，必须携带于URL中
     * @return JsonResult<Void> 删除操作的结果，如果成功，返回一个空的JSON结果
     */
    @ApiOperation("删除管理员")
    @ApiOperationSupport(order = 300)
    @PostMapping("/{id}/delete")
    public JsonResult<Void> delete(@PathVariable Long id) {
        log.debug("接收到的请求参数：{}", id); // 记录接收到的请求参数
        service.delete(id); // 调用服务层方法，执行删除操作
        return JsonResult.ok(); // 返回操作成功的JSON结果
    }

    /**
     * 查询管理员列表
     *
     * @return JsonResult<Void> 返回结果
     */
    @ApiOperation("查询管理员列表")
    @ApiOperationSupport(order = 420)
    // 权限的检查
    @PreAuthorize("hasAuthority('/ams/admin/read')")
    @GetMapping("")
//    public JsonResult list(@ApiIgnore @AuthenticationPrincipal AdminDetails user) {
    public JsonResult<List<AdminListItemVO>> list(@ApiIgnore @AuthenticationPrincipal LoginPrincipal loginPrincipal) {
        log.debug("接收到查询管理员列表的请求");
        log.debug("当事人：{}", loginPrincipal);
        log.debug("当事人ID:{}", loginPrincipal.getId());
        log.debug("当事人用户名:{}", loginPrincipal.getUsername());
        // 调用服务层的list方法查询管理员列表
        List<AdminListItemVO> admins = service.list();
        log.debug("查询到的管理员列表：{}", admins);
        return JsonResult.ok(admins);
    }
}